#!/usr/bin/env bash
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

usage() {
  cat <<'EOF'
用法: ./build_and_run.sh [--help]

环境变量:
  PROFILE     Spring Profile，默认 dev（示例: dev/test/prod）
  SKIP_TESTS  是否跳过测试，默认 true（true|false）
  JVM_OPTS    传给 JVM 的参数（示例: "-Xms512m -Xmx1024m"）
  APP_ARGS    传给应用的参数（示例: "--server.port=8081"）

示例:
  chmod +x ./build_and_run.sh && ./build_and_run.sh
  PROFILE=prod JVM_OPTS="-Xms512m -Xmx1024m" APP_ARGS="--server.port=8081" ./build_and_run.sh
EOF
}

if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
  usage
  exit 0
fi

log() { printf '[INFO] %s\n' "$*"; }
err() { printf '[ERROR] %s\n' "$*" >&2; }

# 依赖检查
if ! command -v mvn >/dev/null 2>&1; then
  err "未检测到 mvn，请先安装 Maven 并确保在 PATH 中。"
  exit 1
fi
if ! command -v java >/dev/null 2>&1; then
  err "未检测到 java，请先安装 JDK 并确保在 PATH 中。"
  exit 1
fi

# 变量与默认值
PROFILE="${PROFILE:-dev}"
SKIP_TESTS="${SKIP_TESTS:-true}"
JVM_OPTS="${JVM_OPTS:-}"
APP_ARGS="${APP_ARGS:-}"

log "当前配置:"
log "  PROFILE    = ${PROFILE}"
log "  SKIP_TESTS = ${SKIP_TESTS}"
log "  JVM_OPTS   = ${JVM_OPTS:-<empty>}"
log "  APP_ARGS   = ${APP_ARGS:-<empty>}"

# 打包
log "开始使用 Maven 打包项目..."
MVN_ARGS=(--batch-mode clean package)
if [[ "${SKIP_TESTS}" == "true" ]]; then
  MVN_ARGS+=(-DskipTests)
fi
mvn "${MVN_ARGS[@]}"
log "Maven 打包完成。"

# 选择可执行 JAR（排除 original-）
JAR_FILE="$(ls -t target/*.jar 2>/dev/null | grep -v 'original-' | head -n 1 || true)"
if [[ -z "${JAR_FILE}" || ! -f "${JAR_FILE}" ]]; then
  err "未找到可执行 JAR。请确认打包成功且 target/ 下存在可执行 JAR。"
  exit 1
fi

log "发现可执行 JAR: ${JAR_FILE}"
log "即将启动应用（前台运行，Ctrl+C 可停止）..."

# 前台启动应用
# 注意：以下行刻意保留参数的词法分割，便于传入多参数
exec java ${JVM_OPTS:-} -jar "${JAR_FILE}" --spring.profiles.active="${PROFILE}" ${APP_ARGS:-}


